/*
 * Copyright (C), 2013-2015, 拉卡拉
 * FileName: DateUtil.java
 * Author:   hukailiang
 * Date:     2015年1月30日 上午10:46:03
 * Description: //模块目的、功能描述      
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.auxgroup.hr.front.commons.utils;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 日期关联的通用Util方法
 *
 * @author hukailiang
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class DateUtils {

    /**
     * 日志对象
     */
    private static final Logger log = LoggerFactory.getLogger(DateUtils.class);

    public static final String FORMAT_DEFAULT = "yyyy-MM-dd";
    public static final String FORMAT_YYYYMMDD = "yyyyMMdd";
    public static final String FORMAT_YYYYMMDD_XIE = "yyyy/MM/dd";
    public static final String FORMAT_YYYYMMDD_ZN = "yyyy年MM月dd日";
    public static final String FORMAT_YYYYMMDDHH = "yyyyMMddHH";
    public static final String FORMAT_YYYYMM = "yyyyMM";
    public static final String FORMAT_YYYY_MM = "yyyy-MM";
    public static final String FORMAT_HHMMSS = "HH:mm:ss";
    public static final String FORMAT_HHMM = "HH:mm";
    public static final String FORMAT_YYYYMMDDHHMISS = "yyyy-MM-dd HH:mm:ss";
    public static final String FORMAT_YYYYMMDDHHMI = "yyyy-MM-dd HH:mm";
    public static final String FORMAT_YYYYMMDDHHMISSSSS = "yyyy-MM-dd-HH.mm.ss.SSS";
    public static final String FORMAT_YYYYMMDDHHMISS_2 = "yyyy/MM/dd HH:mm:ss";
    public static final String FORMAT_YYYYMMDDHHMI_2 = "yyyy/MM/dd HH:mm";
    public static final String FORMAT_YYMMDDHHMISS = "yyMMddHHmmss";

    public static final String FORMAT_YYYYMMDDHHMISS_14 = "yyyyMMddHHmmss";
    public static final String FORMAT_YYYYMMDDHHMISSSSS_16 = "yyyyMMddHHmmssSSS";

    public static final String FORMAT_YYMMDD = "yyMMdd";
    public static final String FORMAT_YYYY = "yyyy";
    public static final String FORMAT_MM = "MM";
    public static final String FORMAT_DD = "dd";
    public static final String FORMAT_E = "E";
    
    /**
     * 获取当前系统的Locale信息
     *
     * @return 当前系统的Locale信息
     * @author hukailiang 2015年5月14日
     */
    private static Locale getCurrentLocale() {
        return Locale.CHINA;
    }
    
    /**
     * 获取当前系统日期
     *
     * @return Date 当前系统日期
     */
    public static Date getCurrentDate() {
        return Calendar.getInstance().getTime();
    }
    
    /**
     * 获取当前系统日期
     *
     * @param pattern 日期格式描述
     * @return String 当前系统日期
     */
    public static String getCurrentDateAsString(String pattern) {
        return format(Calendar.getInstance().getTime(), pattern);
    }
    /**
     * 获取指定日期字符串的年信息
     *
     * @param text 日期字符串
     * @return 年信息
     */
    public static String getYear(String text) {
        return getYear(text, FORMAT_DEFAULT);
    }

    /**
     * 获取指定日期字符串的年信息
     *
     * @param text 日期字符串
     * @param pattern 日期格式描述
     * @return 年信息
     */
    public static String getYear(String text, String pattern) {
        return format(parseDate(text, pattern), FORMAT_YYYY);
    }

    /**
     * 获取指定日期字符串的月信息
     *
     * @param text 日期字符串
     * @return 月信息
     */
    public static String getMonth(String text) {
        return getMonth(text, FORMAT_DEFAULT);
    }

    /**
     * 获取指定日期字符串的月信息
     *
     * @param text 日期字符串
     * @param pattern 日期格式描述
     * @return 月信息
     */
    public static String getMonth(String text, String pattern) {
        return format(parseDate(text, pattern), FORMAT_MM);
    }

    /**
     * 获取指定日期字符串的日信息
     *
     * @param text 日期字符串
     * @return 日信息
     */
    public static String getDay(String text) {
        return getDay(text, FORMAT_DEFAULT);
    }

    /**
     * 获取指定日期字符串的日信息
     *
     * @param text 日期字符串
     * @param pattern 日期格式描述
     * @return 日信息
     */
    public static String getDay(String text, String pattern) {
        return format(parseDate(text, pattern), FORMAT_DD);
    }

    /**
     * 获取指定日期字符串的星期信息
     *
     * @param text 日期字符串
     * @return 星期信息
     */
    public static String getWeekDay(String text) {
        return getWeekDay(text, FORMAT_DEFAULT);
    }

    /**
     * 获取指定日期字符串的星期信息
     *
     * @param text 日期字符串
     * @param pattern 日期格式描述
     * @return 星期信息
     */
    public static String getWeekDay(String text, String pattern) {
        return format(parseDate(text, pattern), FORMAT_E);
    }

    /**
     * String类型转换成Date
     *
     * @param text String型日期
     * @param pattern 格式要求
     * @return 日期文字描述
     * @author hukailiang
     */
    public static Date parseDate(String text, String pattern) {
        if (StringUtils.isEmpty(text)) {
            return null;
        }
        DateFormat formatter = getDateFormat(pattern);
        try {
            return formatter.parse(text);
        } catch (ParseException e) {
            log.error(e.getMessage(), e);
            return null;
        }
    }

    /**
     * Date类型转换成String
     *
     * @param date Date型日期
     * @param pattern 格式要求
     * @return 日期文字描述
     * @author hukailiang
     */
    public static String format(Date date, String pattern) {
        if (date == null) {
            return null;
        }
        DateFormat formatter = getDateFormat(pattern);
        return formatter.format(date);
    }
    
    /**
     * Timestamp类型转换成String
     *
     * @param date Date型日期
     * @param pattern 格式要求
     * @return 日期文字描述
     * @author hukailiang
     */
    public static String format(Timestamp date, String pattern) {
        if (date == null) {
            return null;
        }
        DateFormat formatter = getDateFormat(pattern);
        return formatter.format(date);
    }
    
    
    /**
     * Date类型转换成String
     *
     * @param date Date型日期
     * @param pattern 格式要求
     * @return 日期文字描述
     * @author hukailiang
     */
    public static Date format2Date(Date date, String pattern) {
        if (date == null) {
            return null;
        }
        DateFormat formatter = getDateFormat(pattern);
        return parseDate(formatter.format(date), pattern);
    }
    
    /**
     * Date类型转换成String
     *
     * @param date Date型日期
     * @param pattern 格式要求
     * @return 日期文字描述
     * @author hukailiang
     */
    public static Date format2Date(Timestamp date, String pattern) {
        if (date == null) {
            return null;
        }
        DateFormat formatter = getDateFormat(pattern);
        return parseDate(formatter.format(date), pattern);
    }
    
    

    /**
     * Calendar类型转换成String
     *
     * @param date Calendar型日期
     * @param pattern 格式要求
     * @return 日期文字描述
     * @author hukailiang
     */
    public static String format(Calendar date, String pattern) {
        return format(date.getTime(), pattern);
    }

    /*
     * 获取正确的DateFormat对象
     * @author hukailiang
     */
    public static DateFormat getDateFormat(String pattern) {
        DateFormat df = new SimpleDateFormat(pattern, getCurrentLocale());
        df.setTimeZone(TimeZone.getDefault());
        return df;
    }
    
    /**
     * 当前日期加减天
     *
     * @param days
     * @return
     * @author tantun
     */
    public static Date addDay(int days){
        Calendar strDate = Calendar.getInstance();
        strDate.add(Calendar.DATE, days);//如果不够减会将月变动
        return strDate.getTime();
    }
    
    /**
     * 当前日期加减月
     *
     * @param months
     * @return
     * @author tantun
     */
    public static Date addMonth(int months){
        Calendar strDate = Calendar.getInstance();
        strDate.add(Calendar.MONTH, months);//如果不够减会将月变动
        return strDate.getTime();
    }
    
    /**
     * 当前日期加减月
     *
     * @param months
     * @return
     * @author tantun
     */
    public static String addMonthString(int months,String pattern){
        Calendar strDate = Calendar.getInstance();
        strDate.add(Calendar.MONTH, months);//如果不够减会将月变动
        return format(strDate.getTime(), pattern);
    }
    
    /**
     * 传入日期加减月
     *
     * @param months
     * @return
     * @author tantun
     */
    public static String addMonthString(String str,int months,String pattern) throws ParseException{
    	SimpleDateFormat sdf= new SimpleDateFormat(pattern);
    	Date date =sdf.parse(str);
    	Calendar calendar = Calendar.getInstance();
    	calendar.setTime(date);
    	calendar.add(Calendar.MONTH, months);//如果不够减会将月变动
        return format(calendar.getTime(), pattern);
    }
    
    /**
     * 
     * 指定日期加减填
     *
     * @param date
     * @param field
     * @param amount
     * @return
     * @author tantun
     */
    public static Date addDay(Date date, int days) {
        if( date == null){
            return null;
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DATE, days);
        return c.getTime();
    }

    /**
     * 根据传入的日期加减月
     *
     * @param date
     * @param months
     * @return
     * @author tantun
     */
    public static Date addMonth(Date date, int months) {
        if( date == null){
            return null;
        }
        Calendar c = Calendar.getInstance();
        c.setTime( date);
        c.add(Calendar.MONTH, months);
        c.set(Calendar.HOUR, 0);
        c.set(Calendar.MINUTE,0);
        c.set(Calendar.SECOND,0);
        c.set(Calendar.MILLISECOND,0);
        return c.getTime();
    }
    /**
     * 获取指定日期的最晚时间
     *
     * @param date 指定日期
     * @return 指定日期的最晚时间
     * @author hukailiang
     */
    public static Date getEndOfDay(Date date) {
        if( date == null){
            return null;
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.set(Calendar.HOUR_OF_DAY, 23);
        c.set(Calendar.MINUTE, 59);
        c.set(Calendar.SECOND, 59);
        c.set(Calendar.MILLISECOND, 000);
        return c.getTime();
    }
    /**
     * 获取指定日期的最早时间
     *
     * @param date 指定日期
     * @return 指定日期的最早时间
     * @author qianjing
     */
    public static Date getStartOfDay(Date date) {
        if( date == null){
            return null;
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
    }

    /**
     * 
     * @Description:获取16位时间戳 
     * @return String
     * @exception/throws [异常类型] [异常说明]
     * @see   [类、类#方法、类#成员]
     * @since [起始版本]
     */
    public static String getTimestampWithLength(){
        String timeInMillis = String.valueOf(Calendar.getInstance().getTimeInMillis());
        String last = timeInMillis.substring(timeInMillis.length()-4, timeInMillis.length());
        return format(getCurrentDate(), FORMAT_YYMMDDHHMISS)+last;
    }

    /**
     * 获取指定日期的当年最后一天的日期
     *
     * @param date 指定日期
     * @return 获取指定日期的当年最后一天的日期
     * @author qianjing
     */
    public static Date getEndOfYear(Date date) {
        if( date == null){
            return null;
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.set(Calendar.MONTH, 11);
        c.set(Calendar.DAY_OF_MONTH, 31);
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
    }
    /**
     * 获取指定日期月份的第一天
     *
     * @param date
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static Date getStartDayOfMonth(Date date){
        if( date == null){
            return null;
        }
        Calendar c = Calendar.getInstance();    
        c.add(Calendar.MONTH, 0);
        c.setTime(date);
        c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 
        Date first = c.getTime();
        return getStartOfDay(first);
    }
    
    /**
     * 传入一个日期和今天相比较
     * 比今天早返回-1
     * 等于今天返回0
     * 比今天晚返回1
     *
     * @param date
     * @return
     * @author zhangkoule
     */
    public static String compareDateWithToday(Date date) {
        if (date == null) {
            return null;
        }
        Date today = new Date();
        today = DateUtils.getStartOfDay(today);

        date = DateUtils.getStartOfDay(date);
        if (date.getTime() > today.getTime()) {
            return "1";
        } else if (date.getTime() == today.getTime()) {
            return "0";
        } else if (date.getTime() < today.getTime()) {
            return "-1";
        }
        return null;
    }
    
	/**
     * <li>功能描述：时间相减得到天数
     * @param beginDateStr
     * @param endDateStr
     * @return
     * long 
     * @author Administrator
     */
    public static long getDaySub(String beginDateStr,String endDateStr,String pattern){
        long day=0;
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        Date beginDate = null;
        Date endDate = null;
        
        try {
			beginDate = format.parse(beginDateStr);
			endDate= format.parse(endDateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
        day=(endDate.getTime()-beginDate.getTime())/(24*60*60*1000);
            //System.out.println("相隔的天数="+day);
      
        return day;
    }
    
    
}
